/*
 * 最大乘积
 *
 * 题目链接：https://programming.pku.edu.cn/probset/c4b75386cfd8411991908475c4b91bc6/ef6b04b013a041418460f2df14868288/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - 记忆化搜索或动态规划
 *
 * 此处为基于记忆化搜索的解法，时间复杂度为 O(S^2)
 */

#include <stdio.h>

// 存最大乘积和首次分解出的因子
double max_prod[1001][1001];
int cur_factor[1001][1001];

// 递归函数，用来寻找最大乘积分解
void solve(int S, int start)
{
  // 记忆化，避免重复计算，大大节省时间
  if(max_prod[S][start] >= 0) return;

  if(start > S) {  // 递归终点 1/2: 逻辑上有矛盾，乘积写为 0，即无效结果
    max_prod[S][start] = 0;
    return;
  }
  if(start == S) {  // 递归终点 2/2: 不能拆分，本身就是一个因子
    max_prod[S][start] = S;
    cur_factor[S][start] = S;
    return;
  }

  // 分治 case 1: cur_factor >= start + 1
  solve(S, start + 1);
  if(max_prod[S][start + 1] > max_prod[S][start]) {
    max_prod[S][start] = max_prod[S][start + 1];
    cur_factor[S][start] = cur_factor[S][start + 1];
  }

  // 分治 case 2: cur_factor == start
  solve(S - start, start + 1);
  double prod = start * max_prod[S - start][start + 1];
  if(prod > max_prod[S][start]) {
    max_prod[S][start] = prod;
    cur_factor[S][start] = start;
  }
}

int main()
{
  int S;
  scanf("%d", &S);

  // 初始化 memoization
  for(int i = 0; i <= S; ++i) {
    for(int j = 0; j <= S; ++j) {
      max_prod[i][j] = -1;  // 标记为未计算
      cur_factor[i][j] = -1;
    }
  }

  solve(S, 1);

  // 提取最优分解方案
  int start = 1;
  while(S) {
    printf("%d ", cur_factor[S][start]);
    int S_new = S - cur_factor[S][start];
    int start_new = cur_factor[S][start] + 1;
    S = S_new, start = start_new;
  }
  fseek(stdout, -1, SEEK_CUR);
  putchar(10);
  return 0;
}
